使用二进制着色器

使用二进制着色器缩短 Kanzi 应用程序的加载时间。默认情况下,Kanzi 使用在线着色器,Kanzi Studio 将其作为源代码导出至 kzb 文件。当在目标设备上启动 Kanzi 应用程序时,应用程序会使用 GL 驱动程序加载并编译着色器。编译过程会增加应用程序的加载时间。如果使用二进制着色器,Kanzi Studio 在您导出 kzb 文件时编译着色器,并以您设置的二进制格式导出着色器。您的目标设备可以立即使用二进制着色器。

您只能在驱动程序支持二进制着色器的那些 GPU 上使用二进制着色器,而且还需要拥有适用于设备上的 GPU 的离线着色器编译器。如果 GPU 不支持二进制着色器,Kanzi Engine 会从源编译着色器。虽然设备厂商声称支持特定的二进制着色器格式,但并不意味设备总是支持所有二进制着色器。

您可以:

使用通用的二进制着色器格式

要使用通用的二进制着色器格式:

  1. 确定您的目标设备所使用的 GPU 的 GPU 厂商、GPU 内核版本和 GPU 驱动程序版本,并从 GPU 厂商那里获得正确的二进制着色器编译器。
  2. Kanzi Studio素材库 (Library) 中,按下 Alt 并右键点击 材质和纹理 (Materials and Textures) > 着色器格式 (Shader Formats),然后选择二进制着色器格式 (Binary Shader Format)

  3. 以您的目标设备所使用的 GPU 名称命名二进制着色器格式。

    GPU 供应商名称 (Name)
    Imagination TechnologiesSGX_BINARY_IMGIMG
    ARM MaliMALI_SHADER_BINARY_ARM
    VivanteSHADER_BINARY_VIV
    Digital Media ProfessionalsSHADER_BINARY_DMP
    Fujitsu SemiconductorGCCSO_SHADER_BINARY_FJ
    NVidiaNVIDIA_PLATFORM_BINARY_NVTegra

    如果您的目标设备使用任何其他 GPU,并且您具备该 GPU 的离线着色器编译器,则使用该着色器格式 GL 常量值的十进制值命名。

  4. 属性 (Properties) 中设置:
    • 已启用 (Enabled) 属性,以便使用二进制着色器格式。当启用 已启用 (Enabled) 属性时,Kanzi Studio 编译 Kanzi Studio 工程中的着色器。Kanzi Studio 会在日志 (Log) 窗口中显示您使用的编译器是否成功编译了着色器。
    • (可选) 主题 (Theme) 到为要求此二进制着色器格式的目标设备所创建的已烘培主题。
      当您将应用程序部署到 GPU 支持不同二进制着色器的不同设备上时,请使用主题在 kzb 文件中,包含只采用特定目标硬件设备所需的二进制着色器格式。请参阅为工程中的多个目标设备设置二进制着色器
    • 顶点着色器编译 (Vertex Shader Compile) 为适用于您的目标设备 GPU 的顶点着色器编译器可执行程序。使用 Kanzi Studio 宏告诉编译器将顶点着色器二进制文件存储在什么地方。
      例如 BinaryShaderCompilerExecutable <vertexshadercode> <vertexshaderbinary>
      顶点着色器代码和顶点着色器二进制文件是文件系统上的临时文件。着色器编译器从 <vertexshadercode> 读取数据并写入 <vertexshaderbinary>。如果您的编译器输出带后缀的二进制,则使用包装脚本输出不带后缀的二进制。
    • 片段着色器编译 (Fragment Shader Compile)为适用于您的目标设备 GPU 的片段着色器编译器可执行文件。使用 Kanzi Studio 宏告诉编译器将片段着色器二进制文件存储在什么地方。
      例如 BinaryShaderCompilerExecutable <fragmentshadercode> <fragmentshaderbinary>
      片段着色器代码和片段着色器二进制文件是文件系统上的临时文件。着色器编译器从 <fragmentshadercode> 读取数据并写入 <fragmentshaderbinary>。如果您的编译器输出带后缀的二进制,则使用包装脚本输出不带后缀的二进制。
    • 当 GPU 供应商提供的编译器将顶点着色器和片段着色器集于一身时,请在组合编译 (Combined Compile) 属性中设置着色器编译器位置和选项。为最好地使用资源,请要么使用顶点着色器编译 (Vertex Shader Compile)片段着色器编译 (Fragment Shader Compile),要么使用组合编译 (Combined Compile),但不要二者同时使用。您可以在 Khronos OpenGL 注册表中找到您的扩展的详细信息。当您使用组合编译 (Combined Compile) 时,请使用以下名称。
    • GPU 供应商名称 (Name)
      Imagination TechnologiesSGX_PROGRAM_BINARY_IMG
      ARM MaliMALI_PROGRAM_BINARY_ARM
      VivantePROGRAM_BINARY_VIV
      Digital Media Professionals
      • SMAPHS30_PROGRAM_BINARY_DMP
      • SMAPHS_PROGRAM_BINARY_DMP
      • DMP_PROGRAM_BINARY_DMP
      NVidiaNVIDIA_PROGRAM_BINARY_NV
      AMDZ400_BINARY_AMD
  5. 要测试目标设备上的二进制着色器是否正常工作,请执行以下操作:
    1. 选择文件 (File) > 导出 (Export) > 导出 KZB (Export KZB)
    2. 启动目标设备上的 Kanzi 应用程序,并查看应用程序日志。如果在日志中没有发现任何与二进制着色器有关的错误,则表明二进制着色器能够正常工作。请参阅部署 Kanzi 应用程序

使用二进制着色器替换 Kanzi 着色器

Kanzi 提供一系列默认材质类型,用于执行基础的渲染操作,例如渲染文本或位块纹理。Kanzi 将默认材质类型存储在专门的 kzb 文件中,后者嵌入在 Kanzi kzcoreui 库中。默认材质类型只提供源着色器,因此应用程序启动过程中或当在应用程序运行时过程中需要使用着色器时,Kanzi 需要一些时间编译着色器。如果想缩短 Kanzi 应用程序的启动时间,您可以用您目标设备的二进制着色调替换掉默认材质类型中内置的源着色器。

要将 Kanzi 着色器替换为二进制着色器,请执行以下操作:

  1. Kanzi Studio 中任意打开以下其中一个工程:
    • <KanziWorkspace>/Assets/RuntimeAssets/Tool_project/RuntimeAssets.kzproj Kanzi Studio 工程。
    • 或您 Kanzi 应用程序的主工程,在 素材库 (Library) 按下 Alt 并右键点击 工程参考 (Project References) 中,选择 现有工程 (Existing Project),再选择 <KanziWorkspace>/Assets/RuntimeAssets/Tool_project/RuntimeAssets.kzproj Kanzi Studio 工程。请参阅组合Kanzi Studio 工程到Kanzi 应用程序
      Kanzi Studio 会在新选项卡中加载 RuntimeAssets 工程。
  2. (可选) 如果您不想用二进制着色器替换掉所有 Kanzi 默认着色器,请删除 RuntimeAssets 工程中以下项目:
    • 您不希望将其着色器替换为二进制着色器的材质。
    • 以上材质所使用的材质类型和着色器文件。
  3. 为您的目标设备创建二进制着色器格式。请参阅使用通用的二进制着色器格式
  4. RuntimeAssets 工程主菜单中选择 工程 (Project) > 属性 (Properties),然后在 属性 (Properties) 中:
    • 禁用 导出着色器源代码 (Export Shader Source Code) 属性。
      如需缩小 kzb 文件大小,请不要导出着色器源代码。
    • 确保:
      • 屏幕导出到 kzb (Export Screen to Kzb) 已禁用
      • 属性命名空间 (Property Namespace) 为空
  5. 选择文件 (File) > 导出 (Export) > 导出 KZB (Export KZB)
    Kanzi Studio 会在 <KanziWorkspace>/Assets/RuntimeAssets/Tool_project/Binary 目录中创建 RuntimeAssets.kzb 文件。
  6. 通过以下任意方式,在 Kanzi 应用程序的资源管理器中注册 RuntimeAssets.kzb 文件:
    • 如果您的 Kanzi 应用程序使用 kzb 配置文件加载启动 kzb 文件,请将 RuntimeAssets.kzb 添加到应用程序主工程的 kzb 配置文件 <project_name>.kzb.cfg 中。
    • 如果您已将 RuntimeAssets.kzproj 作为工程参考添加到应用程序的主 Kanzi Studio 工程,当导出主工程 kzb 文件时,Kanzi Studio 会自动将 RuntimeAssets.kzb 添加到主工程的 kzb 配置文件中。
    • 如果您手动加载启动 kzb 文件,请使用 ResourceManager::addKzbFile 函数,将 RuntimeAssets.kzb 添加到您 Kanzi 应用程序的资源管理器中。
          //在应用程序启动时,将 RuntimeAssets.kzb 文件注册到资源管理器中。
          virtual void onStartup() KZ_OVERRIDE
          {
              getResourceManager()->addKzbFile("RuntimeAssets.kzb");
          }

Kanzi 应用程序启动时,会从 RuntimeAssets.kzb 文件加载二进制着色器,而非使用内置的源着色器。由于 Kanzi Engine 不需要编译源着色器,所以能够缩短 Kanzi 应用程序的启动时间。

为工程中的多个目标设备设置二进制着色器

Kanzi 解决方案中,每个包含着色器的 Kanzi Studio 工程只需要为每种目标设备提供一种二进制着色器格式。在 Kanzi Studio 中,您可以使用主题在每个 kzb 文件中,只包含一个特定目标设备所需的二进制着色器。如果您的 Kanzi Studio 解决方案包含多个工程,您可以将着色器、材质类型和材质存储在专门的资源工程中。这样,您便可以在一个工程中管理不同目标设备的内容。

要为一个工程中的多个目标设备设置二进制着色器,请执行以下操作:

  1. 素材库 (Library) > 主题 (Theme) 中创建一个 主题组 (Theme Group),并在 属性 (Properties) 中启用 导出烘培的用途 (Export Baked Usages) 属性。
    您使用此 主题组 (Theme Group),为每个需要不同二进制着色器格式的目标设备创建主题。
    当启用 导出烘培的用途 (Export Baked Usages) 属性时,您可以从该主题组中的主题烘培资源。请参阅烘培主题 (Theme)
  2. 素材库 (Library) > 主题 (Theme) 中,双击您在上一步创建的 主题组 (Theme Group),然后在 主题编辑器 (Theme Editor) 中为每个需要不同二进制着色器格式的目标设备创建主题。请参阅使用主题 (Theme)
  3. 素材库 (Library) > 材质和纹理 (Materials and Textures) > 着色器格式 (Shader Formats) 中选择您要使用的 二进制着色器格式 (Binary Shader Format),然后在 属性 (Properties) 中将 主题 (Theme) 属性设置为您在上一步中为需要此二进制着色器格式的目标设备创建的主题。
    这样,您便将 Kanzi Studio 设置为导出含有此已烘焙主题的 二进制着色器格式 (Binary Shader Format)
  4. 选择 文件 (File) > 导出 (Export) > 导出烘培的主题二进制 (Export Baked Theme Binaries),并在 导出时要烘培主题和地区 (Themes and Locales to Bake on Export) 窗口中为您创建的 主题组 (Theme Group) 选择任意一个 < All > 以烘焙对应 主题组 (Theme Group) 中的所有主题,或是您想要烘焙的某个特定主题。请参阅导出烘培 主题 (Theme)

当您导出这些已烘焙的主题时,Kanzi Studio 会在每个 kzb 文件中,仅包含拥有您为对应已烘焙主题设置的二进制着色器类型的材质类型。

另请参阅

部署 Kanzi 应用程序

减少着色器切换

优化片段着色器

并行加载资源

着色器最佳实践

排除应用程序的性能问题

最佳实践

组合Kanzi Studio 工程到Kanzi 应用程序

为应用程序制定主题

使用主题 (Theme)

导出主题 (Theme)